home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / kwmv.arc / MV.C < prev    next >
C/C++ Source or Header  |  1985-08-09  |  3KB  |  146 lines

  1. #include <stdio.h>
  2. /* mv.c - implements a version of UNIX mv */
  3. char usage[] = "mv : usage mv file1 [file2 . . fileN] target\r\n";
  4. char target_name[128];
  5. main(argc,argv)
  6.     int argc;
  7.     register char *argv[];
  8. {
  9.     char *target,*fname_part();
  10.     register int i;
  11.     if (argc < 3)
  12.     {
  13.         write(2,usage,sizeof(usage));
  14.         exit(-1);
  15.     }
  16.     target = argv[argc-1];
  17.     /* kill trailing backslashes */
  18.     if (target[i = strlen(target)-1] == '\\')
  19.         target[i] = '\0';
  20.     if (argc == 3)
  21.     {
  22.         /* if the target doesn't exist and it's not a directory then rename */
  23.         if (access(target,0) && !dirp(target))
  24.         {
  25.             fprintf(stderr,"moving %s to %s\n",argv[1],argv[2]);
  26.             rename(argv[1],argv[2]);
  27.         }
  28.         else
  29.         {
  30.             /* if the target is a directory copy to same name that directory */
  31.             if (dirp(target))
  32.             {
  33.                 int len;
  34.                 strcpy(target_name,target);
  35.                 if (target_name[(len = strlen(target_name))-1] != '\\')
  36.                 {
  37.                     target_name[len = strlen(target_name)] = '\\';
  38.                     target_name[len+1] = '\0';
  39.                 }
  40.                 strcat(target_name,fname_part(argv[1]));
  41.                 fprintf(stderr,"moving %s to %s\n",argv[1],target_name);
  42.                 filecopy(target_name,argv[1]);
  43.                 unlink(argv[1]);
  44.             }
  45.             else
  46.             {
  47.                 fprintf(stderr,"moving %s to %s\n",argv[1],target);
  48.                 filecopy(target,argv[1]);
  49.                 unlink(argv[1]);
  50.             }
  51.         }
  52.         exit(0);
  53.     }
  54.     if (!dirp(target))
  55.     {
  56.         fprintf(stderr,"mv : %s isn't a directory\n",target);
  57.         exit(-1);
  58.     }
  59.     for (i = 1; i < argc-1; i++)
  60.     {
  61.         int len;
  62.         strcpy(target_name,target);
  63.         if (target_name[(len = strlen(target_name))-1] != '\\')
  64.         {
  65.             target_name[len = strlen(target_name)] = '\\';
  66.             target_name[len+1] = '\0';
  67.         }
  68.         strcat(target_name,fname_part(argv[i]));
  69.         if (!filep(argv[i]))
  70.         {
  71.             fprintf(stderr,"mv : %s isn't a file\n",argv[i]);
  72.             continue;
  73.         }
  74.         fprintf(stderr,"moving %s to %s\n",argv[i],target_name);
  75.         filecopy(target_name,argv[i]);
  76.         unlink(argv[i]);
  77.     }
  78. }
  79. #include <fcntl.h>
  80. char buffer[BUFSIZ*16];
  81. filecopy(target,source)
  82.     char *target,*source;
  83. {
  84.     int t,s,r;
  85.     if (-1 == (s = open(source,O_RDONLY)))
  86.     {
  87.         fprintf(stderr,"mv : can't open %s\n",target);
  88.         exit(-1);
  89.     }
  90.     if (-1 == (t = open(target,O_TRUNC)))
  91.     {
  92.         fprintf(stderr,"mv : can't open %s\n",target);
  93.         exit(-1);
  94.     }
  95.     while(0 != (r = read(s,buffer,BUFSIZ*16)) && r != -1)
  96.     {
  97.         if(-1 == write(t,buffer,r))
  98.         {
  99.             fprintf(stderr,"mv : error writing %s\n",target);
  100.             exit(-1);
  101.         }
  102.     }
  103.     close(t); close(s);
  104. }
  105. #include <errno.h>
  106. typedef struct
  107. {
  108.     char dos_reserved[21];
  109.     char attribute;
  110.     unsigned file_time;
  111.     unsigned file_date;
  112.     long file_size;
  113.     char file_name[13];
  114. } fcb;
  115. fcb dir;
  116.  
  117. dirp(s)
  118.     char *s;
  119. {
  120.     register int result1,result2;
  121.     /* set the disk transfer address */
  122.     bdos(0x1A,&dir);
  123.     /* do a search first for the directory path */
  124.     return (bdos(0x4E,s,0x10) == 0 && bdos(0x4E,s,0) != 0);
  125. }
  126.  
  127. filep(s)
  128.     char *s;
  129. {
  130.     register int result1,result2;
  131.     /* set the disk transfer address */
  132.     bdos(0x1A,&dir);
  133.     /* do a search first for the directory path */
  134.     return bdos(0x4E,s,0) == 0;
  135. }
  136. char *fname_part(s)
  137.     char *s;
  138. {
  139.     char *r,*rindex();
  140.     if (r = rindex(s,'\\'))
  141.     {
  142.         return r+1;
  143.     }
  144.     return s;
  145. }
  146.